<?php
/**
 * Created by PhpStorm.
 * User: edmmss
 * Date: 2018/11/23
 * Time: 11:35
 */

namespace app\modules\composite;

/**
 * 该组合内的节点必须派生于该组件契约。为了构建成一个组件树，此为强制性操作。
 * Class Form
 * @package app\modules\composite
 */
class Form implements RenderInterface
{
    /**
     * @var array
     */
    private $_elements = [];

    /**
     * 渲染
     * 遍历所有元素，并对他们调用 render() 方法，然后返回表单的完整的解析表达
     * 从外部上看，我们不会看到遍历过程，该表单的操作过程与单一对象实例一样
     *
     * @date   2018/11/23
     * @author edmmss
     * @return string
     */
    public function render(): string
    {
        // TODO: Implement render() method.
        $formCode = '<form>';

        foreach ($this->_elements as $element) {
            /* @var $element RenderInterface */
            $formCode .= $element->render();
        }

        $formCode .= '</form>';

        return $formCode;
    }

    /**
     * 设置元素
     *
     * @date   2018/11/23
     * @author edmmss
     * @param RenderInterface $element
     * @return RenderInterface
     */
    public function addElement(RenderInterface $element)
    {
        return $this->_elements[] = $element;
    }
}